#include "app_modbus.h"

static modbus_t *modbus = NULL;

int app_modbus_init(char *filename)
{
    // 创建modbus对象
    modbus = modbus_new_rtu(filename, 115200, 'N', 8, 1);
    // 设置1:显示调试日志
    modbus_set_debug(modbus, true);
    // 设置2:设置RTS指定数据收发方向
    modbus_rtu_set_rts(modbus, MODBUS_RTU_RTS_NONE);
    // 设置3:超时时间
    modbus_set_response_timeout(modbus, 1, 0);
    // 创建连接
    if (modbus_connect(modbus) == -1)
    {
        log_error("modbus连接失败：%s", modbus_strerror(errno));
        modbus_free(modbus);
        return -1;
    }
    log_info("modbus模块初始化成功");
    return 0;
}
int app_modbus_readInputregs(int device_id, int reg_addr, int reg_num, uint16_t *data_buf)
{
    // 刷新清理缓存
    modbus_flush(modbus);
    // 设置从站ID
    modbus_set_slave(modbus, device_id);
    // 写多个保持寄存器
    if (modbus_read_input_registers(modbus, reg_addr, reg_num, data_buf) == -1)
    {
        // 等待5ms，重新读一次
        usleep(5000);
        if (modbus_read_input_registers(modbus, reg_addr, reg_num, data_buf) == -1)
        {
            log_error("modbus读多个输入寄存器失败：%s", modbus_strerror(errno));
            return -1;
        }
    }
    log_info("modbus读多个输入寄存器成功");
    return 0;
}
// 写多个保持寄存器
int app_modbus_writeHoldRegs(int device_id, int reg_addr, int reg_num, uint16_t *data)
{
    // 刷新清理缓存
    modbus_flush(modbus);
    // 设置从站ID
    modbus_set_slave(modbus, device_id);
    // 写多个保持寄存器
    if (modbus_write_registers(modbus, reg_addr, reg_num, data) == -1)
    {
        // 等待5ms，重新写一次
        usleep(5000);
        if (modbus_write_registers(modbus, reg_addr, reg_num, data) == -1)
        {
            log_error("modbus写多个保持寄存器失败：%s", modbus_strerror(errno));
            return -1;
        }
    }
    log_info("modbus写多个保持寄存器成功");
    return 0;
}

int app_modbus_readCoils(int device_id, int coil_addr, int coil_num, uint8_t *data_buf)
{
    // 刷新清理缓存
    modbus_flush(modbus);
    // 设置从站ID
    modbus_set_slave(modbus, device_id);
    // 写多个保持寄存器
    if (modbus_read_bits(modbus, coil_addr, coil_num, data_buf) == -1)
    {
        // 等待5ms，重新读一次
        usleep(5000);
        if (modbus_read_bits(modbus, coil_addr, coil_num, data_buf) == -1)
        {
            log_error("modbus读多个线圈失败：%s", modbus_strerror(errno));
            return -1;
        }
    }
    log_info("modbus读多个输入线圈成功");
    return 0;
}

int app_modbus_writeCoils(int device_id, int coil_addr, int coil_num, uint8_t *data)
{
    // 刷新清理缓存
    modbus_flush(modbus);
    // 设置从站ID
    modbus_set_slave(modbus, device_id);
    // 写多个保持寄存器
    if (modbus_write_bits(modbus, coil_addr, coil_num, data) == -1)
    {
        // 等待5ms，重新读一次
        usleep(5000);
        if (modbus_write_bits(modbus, coil_addr, coil_num, data) == -1)
        {
            log_error("modbus写多个线圈失败：%s", modbus_strerror(errno));
            return -1;
        }
    }
    log_info("modbus写多个输入线圈成功");
    return 0;
}
void app_modbus_close(void)
{
  // 关闭连接
  modbus_close(modbus);
  // 释放资源
  modbus_free(modbus);
}
